Tanel Poder Consulting
I solve (big) computer problems.
Online & Video Training
Go to my learning platform:
Talks & Videos
Latest Articles
  
  - 
    New Training Deep Dives: Handling Oracle Optimizer, Partitioning and I/O-Intensive Databases
  
- 
    tabhisthybrid.sql: Display Oracle hybrid histograms and filter cardinality estimates
  
- 
    pqr.sql: Generate QR Codes with Pure SQL in PostgreSQL
  
- 
    The xCapture and xtop eBPF tools are now in beta, with a demo dataset
  
- 
    CatVector Demo Website
  
- 
    New Tool: xstack - Completely Passive eBPF Linux Stack Profiling Without Any Tracepoints
  
- 
    Dimensional Analysis of System Performance with eBPF & xtop: Top for Wall-Clock Time
  
- 
    Webinar: Testing High-Performance Vector Search With CatBench on Google AlloyDB Omni
  
- 
    My Blog Has Turned 18 Years Old
  
- 
    Catbench Vector Search App has Postgres Query Throughput and Latency Monitoring Now
  
- 
    Using Postgres pg_test_fsync tool for testing low latency writes
  
- 
    Find which Oracle SQL_ID hits the SQL*Net break/reset to client event
  
- 
    New Tool: lsds - List All Linux Block Devices and Settings in One Place
  
- 
    Optimizing eBPF I/O latency accounting when running 37M IOPS on a 384-CPU server
  
- 
    xCapture v3: Linux Performance Analysis with Modern eBPF and DuckDB
  
- 
    Core Function Words Translated between English, Spanish, German, French and Swedish
  
- 
    When eBPF task->stack->pt_regs reads return garbage on the latest Linux kernels, blame Fred!
  
- 
    TracepointArgs: List Any Linux Tracepoint with Their Arguments, Datatypes and Related Structs
  
- 
    CatBench Vector Search Playground
  
- 
    Embedding Vectors of the Same Image Rotated Over 360 Degrees
  
- 
    SQL Plan Execution FlameGraphs with Loop and Row Counts
  
- 
    Embedding Vectors vs. Vector Embeddings
  
- 
    Video: Testing the Silk Platform in 2024 Interview (12 minutes)
  
- 
    Testing the Silk Platform in 2024: Achieving 20 GiB/s I/O Throughput in a Single Cloud VM
  
- 
    Visualizing and Comparing Embedding Vectors as Heatmaps (Videos)
  
- 
    Visualizing and Comparing Embedding Vectors as Heatmaps
  
- 
    Tracking, not Tracing, Linux Thread Activity for Complete System Visibility (eBPF Summit)
  
- 
    Python Supports Profiling with Perf - How Does It Work?
  
- 
    Can a User Process Consume Kernel Mode CPU Without a Syscall?
  
- 
    Next Big Thing: X-Ray Vision for Linux Systems with eBPF
  
- 
    Syscallargs: List All Linux System Calls With Their Arguments
  
- 
    RTX4090 converted into an eGPU
  
- 
    Oracle Hint Scopes and Join Level Cardinality Hint
  
- 
    New Commenting System
  
- 
    Oracle Shared Pool Internals: Allocated Chunk Status Indicators in Heap Dumps
  
- 
    Oracle Index Parallel Degree Fix After Parallel Creation or Rebuild
  
- 
    Report Current Oracle Session Wait Chains from GV$SESSION without ASH
  
- 
    Advanced Oracle Troubleshooting Guide, Part 13: OStackProf for Linux, Unix & MacOSX Clients
  
- 
    Testing Oracle's Use of Optane Persistent Memory, Part 2 - Fast Log File Sync Waits
  
- 
    Testing Oracle's Use of Optane Persistent Memory, Part 1 - Low Latency Commits
  
- 
    MySQL Now Shows its Thread Names at OS Level for Better Troubleshooting
  
- 
    xb.sql and xbi.sql - Explain Oracle Execution Plans Better! (Part 2)
  
- 
    My New Learning Platform and What I'm Up To in 2022
  
- 
    Achieving 10 GB/s Scanning Rate in a Single Cloud VM
  
- 
    Testing The Silk Platform - Hands-On Technical Analysis of High-Performance I/O in the Cloud
  
- 
    Virtual Conference: Troubleshooting Very Complex Oracle Performance Problems
  
- 
    Do Not Use '>' in Your Command Prompt (and How to Stay Safe in Shell)
  
- 
    Is Your Linux Version Hiding Interrupt CPU Usage From You?
  
- 
    Video: High Performance Block I/O on Linux
  
- 
    Achieving 11M IOPS & 66 GiB/s IO on a Single ThreadRipper Workstation
  
- 
    Oracle Wait Event Name vs. Display Name
  
- 
    Measuring Java JVM thread activity in Linux with task state sampling
  
- 
    Reasons why SELECT * is bad for SQL performance
  
- 
    High System Load with Low CPU Utilization on Linux?
  
- 
    Hacking Session: 7 Levels of Hint Invalidity in Oracle SQL
  
- 
    Hacking Session: Oracle SQL Monitoring - Understanding the Execution Timeline column and CPU usage
  
- 
    Virtual Conference: Systematic Oracle SQL Optimization Interview Videos
  
- 
    Oracle Fatal Background Processes
  
- 
    Virtual Conference Update: Systematic Oracle SQL Optimization in 2020
  
- 
    Oracle Shared Pool Internals: List Chunk Position in the LRU List
  
- 
    SchedLat: a Low Tech Script for Measuring Process CPU Scheduling Latency on Linux
  
- 
    Announcing My Retirement (in 2030)!
  
- 
    ORA-12850: Could not allocate slaves on all specified instances error and a workaround for my scripts
  
- 
    Oracle Performance Troubleshooting Without OS Access, Part 1: Identifying CPU Scheduling Latency
  
- 
    Video: Troubleshooting Complex Oracle Performance Problems (Jan 2020)
  
- 
    Hacking Session: Troubleshooting Complex Oracle Performance Problems (January 2020)
  
- 
    help.sql: Show TPT Script Purpose and Syntax
  
- 
    Oracle State Objects and Reading System State Dumps Hacking Session Video
  
- 
    New scripts: xb.sql and xbi.sql - Explain Oracle Execution Plans Better! (Part 1)
  
- 
    Dump Current Oracle SQL Execution Plan Line ID Using Oradebug
  
- 
    pSnapper: Linux Process Snapper Page and Videos
  
- 
    Announcing Linux Process Snapper tool and a Linux Troubleshooting Hacking Session (3rd April 9am PDT)
  
- 
    What Caused This Wait Event: Using Oracle's wait_event[] tracing
  
- 
    Tutorial: Troubleshooting Linux SSH Login Delay - Why does logging in always take 10 seconds?
  
- 
    Practical Linux Performance & Application Troubleshooting Training Details and Table of Contents
  
- 
    Scripts for Drilling Down Into Unknown Optimizer Changes
  
- 
    Visualizing SQL Plan Execution Time With FlameGraphs
  
- 
    Generate Oracle SQL Monitoring Reports as HTML using SQL Developer v18.3 (no Flash needed)
  
- 
    Log file switch (checkpoint incomplete) wait events and LGWR waiting for checkpoint progress
  
- 
    Oracle SQL Monitoring and Advanced ASH Usage Hacking Sessions!
  
- 
    Oracle SQL Tuning training & Oracle Troubleshooting training and some Linux stuff too!
  
- 
    Webinar: Troubleshooting a Complex Oracle Performance Issue
  
- 
    My Performance & Troubleshooting scripts (TPT) for Oracle are now in GitHub and open sourced
  
- 
    Video: Oracle X$TRACE, Wait Event Internals and Background Process Communication
  
- 
    Secret Hacking Session: Oracle Background Process Communication, Exotic Wait Events and Some Tracing too
  
- 
    Advanced Oracle Troubleshooting seminar in 2018!
  
- 
    Apache Impala Internals Deep Dive with Tanel Poder + Gluent New World Training Month
  
- 
    GNW01: In-Memory Processing for Databases
  
- 
    My BIWA Summit Presentations
  
- 
    RAM is the new disk – and how to measure its performance – Part 3 – CPU Instructions & Cycles
  
- 
    My New Youtube Channel
  
- 
    Troubleshooting Another Complex Performance Issue – Oracle direct path inserts and SEG$ contention
  
- 
    SQL Monitoring in Oracle Database 12c
  
- 
    Advanced Oracle Troubleshooting v2.5 (with 12c stuff too)
  
- 
    RAM is the new disk – and how to measure its performance – Part 2 – Tools
  
- 
    RAM is the new disk – and how to measure its performance – Part 1 – Introduction
  
- 
    The Hybrid World is Coming
  
- 
    Old ventures and new adventures
  
- 
    Advanced Oracle Troubleshooting Guide – Part 12: control file reads causing enq: SQ – contention waits?
  
- 
    Sqlplus is my second home, part 8: Embedding multiple sqlplus arguments into one variable
  
- 
    Oracle Exadata Performance: Latest Improvements and Less Known Features
  
- 
    Oracle In-Memory Column Store Internals – Part 1 – Which SIMD extensions are getting used?
  
- 
    About index range scans, disk re-reads and how your new car can go 600 miles per hour!
  
- 
    Combining Bloom Filter Offloading and Storage Indexes on Exadata
  
- 
    What the heck are the /dev/shm/JOXSHM_EXT_x files on Linux?
  
- 
    Oracle Memory Troubleshooting, Part 4: Drilling down into PGA memory usage with V$PROCESS_MEMORY_DETAIL
  
- 
    Slides of my previous presentations
  
- 
    Where does the Exadata storage() predicate come from?
  
- 
    Oracle X$ tables – Part 1 – Where do they get their data from?
  
- 
    cell flash cache read hits vs. cell writes to flash cache statistics on Exadata
  
- 
    Hard Drive Predictive Failures on Linux and Exadata
  
- 
    When do Oracle Parallel Execution Slaves issue buffered physical reads – Part 2?
  
- 
    When do Oracle Parallel Execution Slaves issue buffered physical reads – Part 1?
  
- 
    Diagnosing buffer busy waits with the ash_wait_chains.sql script (v0.2)
  
- 
    SGA bigger than the amount of HugePages configured (Linux – 11.2.0.3)
  
- 
    Why doesn’t ALTER SYSTEM SET EVENTS set the events or tracing immediately?
  
- 
    Advanced Oracle Troubleshooting Guide – Part 11: Complex Wait Chain Signature Analysis with ash_wait_chains.sql
  
- 
    Oracle Performance & Troubleshooting Online Seminars in 2013
  
- 
    Scalar Subqueries in Oracle SQL WHERE clauses (and a little bit of Exadata stuff too)
  
- 
    ShowMOS: How to get rid of the annoying “The Page has Expired” dialog in My Oracle Support
  
- 
    Oracle 12c: Scalar Subquery Unnesting transformation
  
- 
    Oracle Database 12c R1 (12.1.0.1.0) is finally released!
  
- 
    Getting the Most Out of ASH online seminar
  
- 
    Forcing Smart Scans on Exadata – is the _serial_direct_read parameter safe to use in production?
  
- 
    Debugger Dangers – Part 2
  
- 
    List Exadata Storage Cell disk summary with cellpd.sql and cellpdx.sql scripts
  
- 
    List Exadata Disk Layout and Topology with the exadisktopo scripts
  
- 
    V$CELL_THREAD_HISTORY – “ASH” for Exadata Storage Cells
  
- 
    Understanding what a hint affects using the V$SQL_FEATURE views
  
- 
    Listing Exadata storage cells and their configuration info from V$CELL_CONFIG
  
- 
    Alter session force parallel query doesn’t really force anything
  
- 
    asqlmon.sql: SQL Monitoring-like execution plan line level drilldown into SQL response time
  
- 
    ExaSnapper 0.7 beta download and the hacking session videos
  
- 
    Peeking into Linux kernel-land using /proc filesystem for quick’n’dirty troubleshooting
  
- 
    Even more Snapper – v4.03 now works in SQL Developer too!
  
- 
    Manual “before” and “after” snapshot support in Snapper v4
  
- 
    Snapper v4.02 and the Snapper launch party video
  
- 
    Drilling Deep Into Exadata Performance with ASH, SQL Monitoring and Exadata Snapper – slides and a hacking session!
  
- 
    Troubleshooting high CPU usage with poor-man’s stack profiler – in a one-liner!
  
- 
    Session Snapper v4 – The World’s Most Advanced Oracle Troubleshooting Script!
  
- 
    Sqlplus is my second home: Part 7 – Downloading files via sqlplus :-)
  
- 
    Japanese translation of some of my blog articles
  
- 
    What the heck is the INTERNAL_FUNCTION in execution plan predicate section?
  
- 
    A tip for lazy Oracle users – type less with ANSI DATE and TIMESTAMP SQL syntax
  
- 
    Snapper v3.61 released – and more work is in progress!
  
- 
    Select statement generating redo – and lost write detection
  
- 
    Sqlplus is my second home: Part 6 – Colorizing sqlplus and terminal output
  
- 
    Optimizer statistics-driven direct path read decision for full table scans (_direct_read_decision_statistics_driven)
  
- 
    The limitations of CURSOR_SHARING = FORCE and FORCE_MATCHING_SIGNATURE for SQL plan stability
  
- 
    MOATS-like sqlplus “top” utility for RAC
  
- 
    Oradebug hanganalyze with a prelim connection and “ERROR: Can not perform hang analysis dump without a process state object and a session state object.”
  
- 
    Advanced Oracle Troubleshooting Guide – Part 10: Index unique scan doing multiblock reads?!
  
- 
    Where is LOB data stored?
  
- 
    Exadata Smart Scan predicate offloading and sequence.NEXTVAL
  
- 
    Create a database link with the new host:port/service syntax
  
- 
    Oracle Core: Essential Internals for DBAs and Developers book by Jonathan Lewis
  
- 
    Profiling trace files with preprocessor external tables in 11g and some parallel execution hacking
  
- 
    Evil things are happening in Oracle
  
- 
    What the heck is the SQL Execution ID – SQL_EXEC_ID?
  
- 
    V8 Bundled Exec call – and Oracle Program Interface (OPI) calls
  
- 
    Full scans, direct path reads and ORA-8103 error hacking session video
  
- 
    Are you getting the most out of your Exadata performance? Part 1
  
- 
    What is the purpose of segment level checkpoint before DROP/TRUNCATE of a table?
  
- 
    Another cache buffers chains latch contention troubleshooting example using LatchProf
  
- 
    Tech Reviewer, Tech Reviewer! ;-)
  
- 
    IOUG Select Journal Editor’s Choice Award 2011
  
- 
    Knowing what you want to achieve before thinking of how to achieve it – a query optimization example
  
- 
    Running SELECT … INTO :bind_variable from SQL
  
- 
    Latch contention troubleshooting case study and Flashback Database performance issues with LOBs
  
- 
    MOATS: The Mother of All Tuning Scripts!
  
- 
    An index of my TPT scripts
  
- 
    LOBREAD SQL Trace entry in Oracle 11.2 (and tracing OPI calls with event 10051)
  
- 
    Implicit datatype conversion in the parsing phase – something new I learned today!
  
- 
    ORA-4031 errors, contention, cursor management issues and shared pool fragmentation – free secret seminar!
  
- 
    Exadata CAN do smart scans on bitmap indexes
  
- 
    Oracle Exadata Performance series – Part 1: Should I use Hugepages on Linux Database Nodes?
  
- 
    Finding Oracle Homes which Oracle instances are using on Linux
  
- 
    New cursor_bind_capture_destination parameter in Oracle 11.2.0.2
  
- 
    Performance Stories from Exadata Migrations
  
- 
    Is this valid SQL syntax? :-)
  
- 
    Snapper 3.52 – With Oracle 9.2 support!
  
- 
    Asynch descriptor resize wait event in Oracle
  
- 
    A little new feature for shared pool geeks :-)
  
- 
    COUNT STOPKEY operation (the where ROWNUM <= N predicate) doesn't process over ~4 Billion rows and returns wrong results
  
- 
    Read currently running SQL statement’s bind variable values using V$SQL_MONITOR.BIND_XML in Oracle 11.2
  
- 
    The most fundamental difference between hash and nested loop joins
  
- 
    Oracle Closed World presentation links
  
- 
    Which number takes more space in an Oracle row?
  
- 
    Exadata v2 Smart Scan Performance Troubleshooting article
  
- 
    Dropping and creating tables in read only tablespaces?!
  
- 
    The full power of Oracle’s diagnostic events, part 2: ORADEBUG DOC and 11g improvements
  
- 
    Oracle memory troubleshooting article
  
- 
    Flexible Sqlplus command line history with RLWRAP
  
- 
    Execution plan Quiz: Shouldn’t these row sources be the other way around ;-)
  
- 
    Quiz: Explaining index creation
  
- 
    cursor: pin S waits, sporadic CPU spikes and systematic troubleshooting
  
- 
    KGH: NO ACCESS – Buffer cache inside streams pool too!
  
- 
    Non-trivial performance problems
  
- 
    Calculate SQL_ID and SQL_HASH_VALUE from SQL text
  
- 
    Oracle Latch Contention Troubleshooting
  
- 
    Oracle Session Snapper v3.10
  
- 
    How to CANCEL a query running in another session?
  
- 
    New versions of LatchProf and LatchProfX for latch contention troubleshooting and tuning
  
- 
    Oracle Troubleshooting: How to read Oracle ERRORSTACK output?!
  
- 
    Using Process Memory Matrix script for calculating Oracle process memory usage on Solaris
  
- 
    Oracle Wait Event reference
  
- 
    Oracle Peformance Visualization…
  
- 
    Bind Variable Peeking – execution plan inefficiency
  
- 
    Recursive sessions…
  
- 
    Sometimes things are easy (Part 1): How to fix wrapped execution plan text?
  
- 
    Beyond Oracle Wait Interface – Part 2
  
- 
    NULL is not zero!
  
- 
    Measuring what matters
  
- 
    Finding the reasons for excessive logical IOs
  
- 
    Explain Plan For command may show you the wrong execution plan – Part 1
  
- 
    Detect chained and migrated rows in Oracle – Part 1
  
- 
    What’s a good way to learn some Oracle internals every day?
  
- 
    SystemTap is production supported in Redhat EL5.4
  
- 
    KGL simulator, shared pool simulator and buffer cache simulator – what are these?
  
- 
    KGH: NO ACCESS allocations in V$SGASTAT – buffer cache within shared pool!
  
- 
    Oracle 11gR2 has been released – and with column oriented storage option
  
- 
    latch: cache buffers chains latch contention – a better way for finding the hot block
  
- 
    Select COUNT(*) and COUNT(column) are different things!
  
- 
    Alter system kill session and ORA-00031: session marked for kill
  
- 
    An interview with me
  
- 
    How to detect when a cursor was closed from SQL trace output?
  
- 
    Identify the SQL statement causing those WAIT #X lines in a (top-truncated) sql tracefile
  
- 
    (Secret) Preview of Oracle 12g CBO leaked from Oracle labs…
  
- 
    Oracle memory troubleshooting, Part 3: Automatic top subheap dumping with heapdump
  
- 
    Using Perfsheet and TPT scripts for solving real life performance problems
  
- 
    ORA-04031 errors and monitoring shared pool subpool memory utilization with sgastatx.sql
  
- 
    Oracle Performance Visualization videos from Sydney
  
- 
    Scripts for showing execution plans via plain SQL and also in Oracle 9i
  
- 
    “Free” DBA_HIST AWR views in 11g…
  
- 
    I have been troubleshooting since I was a kid! :)
  
- 
    Tracing Oracle SQL plan execution with DTrace
  
- 
    Seminar feedback and pictures from Singapore
  
- 
    Read OS environment variables using DBMS_SYSTEM.GET_ENV()
  
- 
    I’m an Oracle ACE Director now :)
  
- 
    Oracle 11g: Reading alert log via SQL
  
- 
    Another LatchProfX use case
  
- 
    The real history of Oracle database revealed!
  
- 
    Oracle, Timesten and PL/SQL support
  
- 
    The full power of Oracle’s diagnostic events, part 1: Syntax for KSD debug event handling
  
- 
    60000 bind variables?! Maybe it’s time to use a temporary table instead…
  
- 
    SQL_ID is just a fancy representation of hash value
  
- 
    Performance Visualization, Capacity planning and Hotsos Symposium
  
- 
    When was a table last changed?
  
- 
    Multipart cursor subexecution and PRECOMPUTE_SUBQUERY hint
  
- 
    Identifying shared memory segment users using lsof
  
- 
    Reliable latch waits and a new blog
  
- 
    Oracle memory troubleshooting, Part 1: Heapdump Analyzer
  
- 
    Performance Visualization made easy – PerfSheet 2.0 beta
  
- 
    A little oradebug enhancement in Oracle 11g
  
- 
    Advanced Oracle Troubleshooting Guide, Part 9 – Process stack profiling from sqlplus using OStackProf
  
- 
    Transportable tablespaces and ROWID uniqueness
  
- 
    VLDB 2008 proceedings, Oracle optimizer plan stability, adaptive cursor sharing and SecureFiles
  
- 
    Oracle hidden costs revealed, Part2 – Using DTrace to find why writes in SYSTEM tablespace are slower than in others
  
- 
    Flexible sampling of any V$ or X$ view with sample.sql
  
- 
    Case study on some rowcache internals, cached non-existent objects and a describe bug
  
- 
    Why does even a small difference in SQL text cause a hard parse?
  
- 
    Script: Display valid values for multioption parameters (including hidden parameters)
  
- 
    The simplest query for checking what’s happening in a database
  
- 
    Library cache latches gone in Oracle 11g
  
- 
    Advanced Oracle Troubleshooting Guide, Part 8: Even more detailed latch troubleshooting using LatchProfX
  
- 
    Closed database and WITH subquery
  
- 
    Advanced Oracle Troubleshooting Guide, Part 7: Sampling latch holder statistics using LatchProf
  
- 
    Another use case for WaitProf – diagnosing “events in waitclass Other”
  
- 
    Killing an Oracle process from inside Oracle
  
- 
    cursor_space_for_time To Be Deprecated
  
- 
    Advanced Oracle Troubleshooting Guide, Part 6: Understanding Oracle execution plans with os_explain
  
- 
    Debugger dangers
  
- 
    Short note on KGX Mutexes
  
- 
    Generating lots of rows using connect by – safely!
  
- 
    Advanced Oracle Troubleshooting Guide, Part 5: Sampling V$ stuff with WaitProf. Really fast. Using SQL!
  
- 
    Performance Tools Quick Reference Guide
  
- 
    Advanced Oracle Troubleshooting Guide, Part 4: Diagnosing a long parsing issue
  
- 
    Snapper shortcut
  
- 
    Querying the current tracefile name, using SQL – with tracefile_identifier
  
- 
    Oracle Troubleshooting with Snapper – detecting who’s causing excessive redo generation
  
- 
    Performance and Scalalability Improvements in Oracle 10g and 11g
  
- 
    Using autonomous transactions for sleeping
  
- 
    SQL*Net break/reset to client
  
- 
    SQL*Net message to client vs SQL*Net more data to client
  
- 
    SQL*Net message to client wait isn’t really what it’s thought to be
  
- 
    Oracle hidden costs revealed, part 1 – Does a batch job run faster when executed locally?
  
- 
    Excellent article on Oracle 11g PL/SQL function result cache
  
- 
    Can you write a working SQL statement without using any whitespace?
  
- 
    Expensive calculator…
  
- 
    Why does Oracle parameter count change during session lifetime?
  
- 
    Systematic application troubleshooting in Unix
  
- 
    Perl version of Snapper
  
- 
    Sqlplus is my second home, part 5: Reading the name of currently executing script
  
- 
    Oracle Security, Part 2: Your read only accounts aren’t that read only
  
- 
    Sqlplus is my second home, part 4: Getting sqlplus parameter value into a variable
  
- 
    A simple interview question
  
- 
    How to resolve SQL object and column names all the way to base tables and columns in Oracle?
  
- 
    Advanced Oracle Troubleshooting Guide, Part 3: More adventures in process stack
  
- 
    Sqlplus is my second home, part 3: Colored selections in Windows XP command prompt
  
- 
    Sqlplus is my second home, part 2: Running SQL scripts from remote locations using HTTP
  
- 
    Operating systems are lazy allocating memory
  
- 
    Advanced Oracle Troubleshooting Guide, Part 2: No magic is needed, systematic approach will do
  
- 
    Oracle Session Snapper, part 2: Getting most out of Snapper
  
- 
    Oracle 11g internals part 1: Automatic Memory Management
  
- 
    Oracle Session Snapper – real-time session-level performance stats for DBAs
  
- 
    Sqlplus is my second home, Part 1: HTMLizing your sqlplus output
  
- 
    Session-level statspack
  
- 
    A gotcha with parallel index builds, parallel degree and query plans
  
- 
    My version of SQL string to table tokenizer
  
- 
    Advanced Oracle Troubleshooting Guide: When the wait interface is not enough [part 1]